package main

import (
	"expvar"
	"flag"
	"fmt"
)

func main() {
	v := MyValue{}
	v.Set("aaa")
	fmt.Println(v.String())

	// 类型改为flag.Value
	var vv flag.Value
	vv = &v
	vv.Set("bbb")
	fmt.Println(vv.String())

	// 但是 expvar.Var 接口，也有String() 方法。可以修改类型expvar.Var
	// 所以在golang中，一个方法的接口来源，允许是多种。
	var v2 expvar.Var
	v2 = &v
	fmt.Println(v2.String())
}

/*
实现 flag包下的Value接口

	type Value interface {
		String() string
		Set(string) error
	}
*/

type MyValue struct {
	value string
}

func (m *MyValue) String() string {
	return m.value
}

func (m *MyValue) Set(s string) error {
	m.value = s
	return nil
}
